home *** CD-ROM | disk | FTP | other *** search
- /*
- * $Id: texdraw.trm%v 3.50 1993/07/09 05:35:24 woo Exp $
- */
-
- /* GNUPLOT - texdraw.trm */
- /*
- * Copyright (C) 1990
- *
- * Permission to use, copy, and distribute this software and its
- * documentation for any purpose with or without fee is hereby granted,
- * provided that the above copyright notice appear in all copies and
- * that both that copyright notice and this permission notice appear
- * in supporting documentation.
- *
- * Permission to modify the software is granted, but not the right to
- * distribute the modified code. Modifications are to be distributed
- * as patches to released version.
- *
- * This software is provided "as is" without express or implied warranty.
- *
- * This file is included by ../term.c.
- *
- * This terminal driver supports:
- * The TEXDRAW macros for LaTeX.
- *
- * AUTHORS
- * Khun Yee Fung. Modified from eepic.trm.
- * clipper@csd.uwo.ca
- * January 20, 1992
- *
- * send your comments or suggestions to (info-gnuplot@dartmouth.edu).
- *
- */
-
- /*
- * This file contains the texdraw terminal driver, intended for use with the
- * texdraw macro package for LaTeX. This is an alternative to the
- * latex driver. You need texdraw.sty, and texdraw.tex in the texdraw package.
- *
- */
-
- #define TEXDRAW_PTS_PER_INCH (72.27)
- #define DOTS_PER_INCH (300) /* resolution of printer we expect to use */
- #define TEXDRAW_UNIT (TEXDRAW_PTS_PER_INCH/DOTS_PER_INCH) /* dot size in pt */
-
- /* 5 inches wide by 3 inches high (default) */
- #define TEXDRAW_XMAX (5*DOTS_PER_INCH)
- #define TEXDRAW_YMAX (3*DOTS_PER_INCH)
-
- #define TEXDRAW_HTIC (5*DOTS_PER_INCH/72) /* (5./TEXDRAW_UNIT) */
- #define TEXDRAW_VTIC (5*DOTS_PER_INCH/72) /* (5./TEXDRAW_UNIT) */
- #define TEXDRAW_HCHAR (DOTS_PER_INCH*53/10/72) /* (5.3/TEXDRAW_UNIT) */
- #define TEXDRAW_VCHAR (DOTS_PER_INCH*11/72) /* (11./TEXDRAW_UNIT) */
-
- static unsigned int TEXDRAW_posx;
- static unsigned int TEXDRAW_posy;
- enum JUSTIFY TEXDRAW_justify = LEFT;
- enum JUSTIFY TEXDRAW_last_justify = LEFT;
- static int TEXDRAW_angle = 0;
- static float TEXDRAW_scalefactor = 0.2409;
- static double TEXDRAW_xscale = 1.0, TEXDRAW_yscale = 1.0;
-
- /* for DOTS point style */
- #define TEXDRAW_TINY_DOT "\\htext{$\\cdot$}"
-
- /* POINTS */
- #define TEXDRAW_POINT_TYPES 12 /* we supply more point types */
- static char GPFAR * GPFAR TEXDRAW_points[] =
- {
- "\\rmove(0 4)\\htext{$\\Diamond$}",
- "\\htext{$+$}",
- "\\rmove(0 4)\\htext{$\\Box$}",
- "\\htext{$\\times$}",
- "\\htext{$\\triangle$}",
- "\\htext{$\\star$}",
- "\\lcir f:9",
- "\\lcir f:12",
- "\\lcir f:16",
- "\\fcir f:0.9 r:9",
- "\\fcir f:0.9 r:12",
- "\\fcir f:0.9 r:16"
- };
-
- /* LINES */
- #define TEXDRAW_NUMLINES 5 /* number of linetypes below */
- static int TEXDRAW_lines[] =
- {
- 4, /* -2 border */
- 3, /* -1 axes */
- 3, /* 0 solid thin */
- 4, /* 1 solid thick */
- 6, /* 2 solid Thick */
- };
-
- static int TEXDRAW_last_type = 0; /* The line type selected most recently */
- static int TEXDRAW_type; /* current line type */
- static TBOOLEAN TEXDRAW_inline = FALSE; /* are we in the middle of a line */
- static void TEXDRAW_endline(); /* terminate any line in progress */
- static int TEXDRAW_linecount = 0; /* number of points in line so far */
- #define TEXDRAW_LINEMAX 5 /* max value for linecount */
-
- TEXDRAW_init()
- {
- TEXDRAW_posx = TEXDRAW_posy = 0;
- TEXDRAW_linetype(-1);
- fprintf(outfile, "%% GNUPLOT: LaTeX using TEXDRAW macros\n");
- }
-
-
- TEXDRAW_scale(xs, ys)
- double xs, ys; /* scaling factors */
- {
- register struct termentry *t = &term_tbl[term];
-
- /* we change the table for use in graphics.c */
- t->xmax = (unsigned int) (TEXDRAW_XMAX * xs);
- t->ymax = (unsigned int) (TEXDRAW_YMAX * ys);
-
- TEXDRAW_xscale = xs;
- TEXDRAW_yscale = ys;
-
- return (TRUE);
- }
-
- TEXDRAW_graphics()
- {
- static char GPFAR tdg1[] = "\
- \\begin{texdraw}\n\
- \\normalsize\n\
- \\ifx\\pathDEFINED\\relax\\else\\let\\pathDEFINED\\relax\n\
- \\def\\QtGfr{\\ifx (\\TGre \\let\\YhetT\\cpath\\else\\let\\YhetT\\relax\\fi\\YhetT}\n\
- \\def\\path (#1 #2){\\move (#1 #2)\\futurelet\\TGre\\QtGfr}\n\
- \\def\\cpath (#1 #2){\\lvec (#1 #2)\\futurelet\\TGre\\QtGfr}\n\
- \\fi\n\
- \\drawdim pt\n\
- \\setunitscale %2.2f\n\
- \\linewd %d\n\
- \\textref h:L v:C\n";
- fprintf(outfile, tdg1,
- TEXDRAW_scalefactor,
- TEXDRAW_lines[2]);
- TEXDRAW_last_type = 0;
- TEXDRAW_type = 0;
- }
-
-
- TEXDRAW_text()
- {
- TEXDRAW_endline();
- fprintf(outfile, "\\end{texdraw}\n");
- }
-
-
- TEXDRAW_linetype(linetype)
- int linetype;
- {
- TEXDRAW_endline();
-
- if (linetype >= TEXDRAW_NUMLINES - 2)
- linetype %= (TEXDRAW_NUMLINES - 2);
-
- TEXDRAW_type = linetype;
- }
-
-
- TEXDRAW_move(x, y)
- unsigned int x, y;
- {
- TEXDRAW_endline();
-
- TEXDRAW_posx = x;
- TEXDRAW_posy = y;
- }
-
-
- TEXDRAW_point(x, y, number)
- unsigned int x, y;
- int number;
- {
- TEXDRAW_move(x, y);
-
- /* Print the character defined by 'number'; number < 0 means
- to use a dot, otherwise one of the defined points. */
- fprintf(outfile, "\\move (%d %d)\n",
- (int)((double) x * TEXDRAW_xscale),
- (int)((double) y * TEXDRAW_yscale));
- if (TEXDRAW_last_justify != CENTRE) {
- fprintf(outfile, "\\textref h:C v:C ");
- TEXDRAW_last_justify = CENTRE;
- }
- fprintf(outfile, "%s\n",
- (number < 0 ?
- TEXDRAW_TINY_DOT :
- TEXDRAW_points[number % TEXDRAW_POINT_TYPES]));
- }
-
-
- TEXDRAW_vector(ux, uy)
- unsigned int ux, uy;
- {
- if (!TEXDRAW_inline) {
- TEXDRAW_inline = TRUE;
-
- /* Start a new line. This depends on line type */
- if (TEXDRAW_type != TEXDRAW_last_type){
- if (TEXDRAW_lines[TEXDRAW_type+2] != TEXDRAW_lines[TEXDRAW_last_type+2])
- fprintf(outfile, "\\linewd %d\n", TEXDRAW_lines[TEXDRAW_type + 2]);
- TEXDRAW_last_type = TEXDRAW_type;
- }
- fprintf(outfile, "\\path (%d %d)",
- (int)((double) TEXDRAW_posx * TEXDRAW_xscale),
- (int)((double) TEXDRAW_posy * TEXDRAW_yscale));
- TEXDRAW_linecount = 1;
- }
- else {
- /* Even though we are in middle of a path,
- * we may want to start a new path command.
- * If they are too long then latex will choke.
- */
- if (TEXDRAW_linecount++ >= TEXDRAW_LINEMAX) {
- fprintf(outfile, "\n\\cpath ");
- TEXDRAW_linecount = 1;
- }
- }
- fprintf(outfile, "(%d %d)",
- (int)((double) ux * TEXDRAW_xscale),
- (int)((double) uy * TEXDRAW_yscale));
- TEXDRAW_posx = ux;
- TEXDRAW_posy = uy;
- }
-
- static void TEXDRAW_endline()
- {
- if (TEXDRAW_inline) {
- fprintf(outfile, "\n");
- TEXDRAW_inline = FALSE;
- }
- }
-
-
- TEXDRAW_arrow(sx, sy, ex, ey, head)
- int sx, sy, ex, ey;
- TBOOLEAN head;
- {
- char text;
-
- if (head)
- text = 'a';
- else
- text = 'l';
- fprintf(outfile, "\\move (%d %d)\\%cvec (%d %d)",
- (int)((double) sx * TEXDRAW_xscale),
- (int)((double) sy * TEXDRAW_yscale),
- text,
- (int)((double) ex * TEXDRAW_xscale),
- (int)((double) ey * TEXDRAW_yscale));
- TEXDRAW_posx = ex;
- TEXDRAW_posy = ey;
- }
-
-
- TEXDRAW_put_text(x, y, str)
- int x, y; /* reference point of string */
- char str[]; /* the text */
- {
- char text;
-
- TEXDRAW_endline();
-
- fprintf(outfile, "\\move (%d %d)",
- (int)((double) x * TEXDRAW_xscale),
- (int)((double) y * TEXDRAW_yscale));
-
- if (!TEXDRAW_angle)
- text = 'h';
- else
- text = 'v';
-
- if (TEXDRAW_last_justify != TEXDRAW_justify) {
- TEXDRAW_last_justify = TEXDRAW_justify;
- if (TEXDRAW_justify == LEFT)
- fprintf(outfile, "\\textref h:L v:C ");
- else if (TEXDRAW_justify == CENTRE)
- fprintf(outfile, "\\textref h:C v:C ");
- else if (TEXDRAW_justify == RIGHT)
- fprintf(outfile, "\\textref h:R v:C ");
- }
- fprintf(outfile, "\\%ctext{%s}\n", text, str);
- }
-
-
- int TEXDRAW_justify_text(mode)
- enum JUSTIFY mode;
- {
- TEXDRAW_justify = mode;
- return (TRUE);
- }
-
- int TEXDRAW_text_angle(angle)
- int angle;
- {
- TEXDRAW_angle = angle;
- return (TRUE);
- }
-
- TEXDRAW_reset()
- {
- TEXDRAW_endline();
- TEXDRAW_posx = TEXDRAW_posy = 0;
- }
-